package hcqs.nav.grid.map.api;

import hcqs.nav.grid.macros.Point;
import hcqs.nav.grid.macros.Pose;

import java.util.List;

/**
 * 栅格地图服务
 */
public interface IGridMapService {
    /**
     * 初始化方法
     *
     * @throws Exception
     */
    void init() throws Exception;

    /**
     * 增加扫描扇区
     *
     * @param agvId       agv id
     * @param p           部分栅格地图的左上角在全局坐标系的坐标
     * @param gridMapPart 部分栅格地图
     * @throws Exception
     */
    void addPartGridMapArea(String agvId, Point p, byte[][] gridMapPart) throws Exception;

    /**
     * 添加部分栅格地图，自行计算障碍物及可通行区域
     *
     * @param agvId        agv id
     * @param agvPose      agv位姿，其中角度为0 ~ 360000，1/1000 度为单位的int类型数值
     * @param obstacleList 障碍物地图
     * @throws Exception
     */
    void addPartGridMapArea(String agvId, Pose agvPose, List<Point> obstacleList) throws Exception;

    /**
     * 获取栅格地图区域
     *
     * @param p          获取区域的原点，该点在全局中的坐标
     * @param width      地图区域长度，x轴方向
     * @param height     地图区域高度，y轴方向
     * @param edgeLength 栅格边长（单位为：mm）
     * @return 地图区域
     * @throws Exception
     */
    byte[][] getGridMapArea(Point p, int width, int height, int edgeLength) throws Exception;

    /**
     * 更新全部地图（在AGV进行全局优化后上传障碍物点云）
     *
     * @param agvId   agv id
     * @param p       原点坐标
     * @param gridMap 栅格地图
     * @throws Exception
     */
    void refreshGridMap(String agvId, Point p, byte[][] gridMap) throws Exception;

    /**
     * 获取全地图（测试用）
     *
     * @return 全地图的二维byte数组
     */
    byte[][] getGridMap();

    /**
     * 显示栅格地图的统计信息（测试用）
     */
    void showGridMapCalc();

    /**
     * 获取地图左上角点的坐标（测试用）
     *
     * @return 左上角点的坐标
     */
    Point getOp();

    void clear();

    void fillObstacleRef(String agvId, int cellSize, List<Point> occupiedPoints) throws Exception;
}
